#include "SeqStack.h"
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
// 创建一个空栈
struct SeqStack*Create_Stack(int capacity)
{
    struct SeqStack*s = malloc(sizeof(*s));
    if(s == NULL)
        return NULL;
    s->data = malloc(sizeof(SElemType)*capacity);
    if(s->data == NULL)
    {
        free(s);
        return NULL;
    }
    s->capacity = capacity;
    s->top = -1;
    return s;
}
// 销毁一个栈
void Destroy_Stack(struct SeqStack*s)
{
    if(s->data)
        free(s->data);
    s->data = NULL;
    free(s);
    s = NULL;

}
// 清空栈
bool Clear_Stack(struct SeqStack*s)
{
    if(s == NULL)
        return false;
    s->top = -1;

    return true;
}
// 判断栈是否为空
bool Is_Empty(struct SeqStack*s)
{
    if(s == NULL)
        return false;
    return s->top == -1 ? true:false;
}

// 判断栈是否为满
bool Is_Full(struct SeqStack*s)
{
    if(s == NULL)
        return false;
    return s->top == s->capacity-1 ? true:false;
}
// 获取栈的长度:元素个数
int Get_Length(struct SeqStack*s)
{
    if(s == NULL)
        return -1;
    return s->top+1;
}

// 出栈
bool Pop(struct SeqStack*s, SElemType* d)
{
    // 不存在栈或空栈
    if(s == NULL || Is_Empty(s))
        return false;
    
    if(d)
        *d = *(s->data+s->top);
    s->top--;

    return true;
    
}
// 入栈
bool Push(struct SeqStack*s, SElemType d)
{
    // 不存在栈或满栈
    if(s == NULL || Is_Full(s))
        return false;
    *(s->data+s->top+1) = d;
    s->top++;

    return true;
}
// 获取栈顶元素，但不出栈
// Get_Top
bool Get_Top(struct SeqStack*s, SElemType* d)
{
    // 不存在栈或空栈
    if(s == NULL || Is_Empty(s))
        return false;
    
    if(d)
        *d = *(s->data+s->top);
  
    return true;
    
}
void Print_SeqStack(struct SeqStack*s)
{
    if(s == NULL)
        return;
    printf("===============\n");
    for(int i = 0; i < Get_Length(s); i++)
    {
        printf("%c ", *(s->data+i));
    }
    printf("\n");
}
/*
    使用顺序栈，接收键盘的输入，实现如下功能：

    1. 输入数字时，依次入栈。
    2. 输入字母时，依次出栈。
    3. 每次入栈或者出栈，都将顺序栈中的各个元素输出出来
*/
void Input_Func()
{
    //创建顺序栈
    struct SeqStack*s = Create_Stack(30);
    if(s == NULL)
        return;
    //操作
    while(1)
    {
        char ch;
        scanf("%c", &ch);
        getchar();
        if(ch == '#')
            break;
        if(ch >= '0' && ch <= '9')
        {
            Push(s, ch);
        }
        else if((ch >= 'a' && ch <= 'z' )|| (ch >= 'A' && ch <= 'Z'))
        {
            Pop(s, NULL);
        }
        Print_SeqStack(s);

    }

    //销毁顺序栈
    Destroy_Stack(s);
}
